package pe.edu.upc.dew.pharma.controller;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import pe.edu.upc.dew.pharma.model.DetalleNotaPedido;
import pe.edu.upc.dew.pharma.model.NotaPedido;
import pe.edu.upc.dew.pharma.model.PedidoCab;
import pe.edu.upc.dew.pharma.model.Producto;
import pe.edu.upc.dew.pharma.model.Proveedor;
import pe.edu.upc.dew.pharma.service.PedidoService;
import pe.edu.upc.dew.pharma.service.ProductoService;
import pe.edu.upc.dew.pharma.service.ProveedorService;
import pe.edu.upc.dew.pharma.util.Constante;
import pe.edu.upc.dew.pharma.util.ServerMail;
import pe.edu.upc.dew.pharma.util.bean.BuscarStockCritico;

@Controller
public class LogisticaController {
	
	private static final Log logger = LogFactory.getLog(LogisticaController.class);
	
	private static final String PAGE_STOCKCRITICO = "stockCritico";
	
	@Autowired
	private ProveedorService proveedorService;
	
	@Autowired
	private ProductoService productoService;
	
	@Autowired
	private PedidoService pedidoService;

	@RequestMapping(Constante.REQUEST_IRSTOCKCRITICO)
	public ModelAndView irStockCritico(@ModelAttribute("buscarStockCritico") BuscarStockCritico buscarStockCritico){//, boolean llamadoPedido, boolean rptaServerMail){
		
		if(logger.isInfoEnabled()){
			logger.info(">> " + Constante.REQUEST_IRSTOCKCRITICO);
		}
		
		List<Producto> productos;
		if(buscarStockCritico == null){
			buscarStockCritico = new BuscarStockCritico();
			buscarStockCritico.setIdProveedor(1);
			productos = new ArrayList<Producto>();
		}else {
			productos = productoService.obtenerProductosStockCritico(buscarStockCritico.getIdProveedor()); 
		}
		
		List<Proveedor> proveedores = proveedorService.obtenerProveedores();
		ModelMap model = new ModelMap();
		model.addAttribute("proveedores", proveedores);
		model.addAttribute("buscarStockCritico", buscarStockCritico);
		model.addAttribute("productos", productos);
		
		if(logger.isInfoEnabled()){
			logger.info("<< " + PAGE_STOCKCRITICO);
		}
		
		return new ModelAndView(PAGE_STOCKCRITICO, model);
	}
	
	@SuppressWarnings("unchecked")
	@RequestMapping(Constante.REQUEST_GENERARPEDIDO)
	public ModelAndView hacerPedido(@RequestParam("hdnPedido") String cadenaPedidos, 
			@RequestParam("hdnProveedor") int idProveedor)
	{
		
		if(logger.isInfoEnabled()){
			logger.info(">> " + Constante.REQUEST_GENERARPEDIDO);
		}
		
		String[] productos = cadenaPedidos.split(":");
		String[] strProductos = new String[productos.length];
		List<DetalleNotaPedido> detalles = new ArrayList<DetalleNotaPedido>();
		DetalleNotaPedido detalleNotaPedido;
		int indiceIniParentesis;
		int indiceFinParentesis;
		int indiceIgual;
		int i = 0;
		for (String strPrd : productos) {
			indiceIniParentesis = strPrd.indexOf("(");
			indiceFinParentesis = strPrd.indexOf(")");
			indiceIgual = strPrd.indexOf("=");
			detalleNotaPedido = new DetalleNotaPedido();
			strProductos[i] = strPrd.substring(0, indiceIniParentesis);
			detalleNotaPedido.getProducto().setIdProducto(strPrd.substring(0, indiceIniParentesis));
			detalleNotaPedido.getProducto().setNombre(strPrd.substring(indiceIniParentesis + 1, indiceFinParentesis));
			detalleNotaPedido.setCantidad(Double.parseDouble(strPrd.substring(indiceIgual + 1)));
			detalles.add(detalleNotaPedido);
			i++;
		}
		
		Proveedor proveedor = proveedorService.obtenerProveedor(idProveedor);
		StringBuilder mensaje = new StringBuilder();
		mensaje.append(proveedor.getContacto()+":\n\n");
		mensaje.append("Por favor atender el siguiente pedido:\n");		
		NotaPedido notaPedido = new NotaPedido();
		notaPedido.setProveedor(proveedor);
		notaPedido.setAsunto("Pedido Pharma");
		notaPedido.setMensaje(mensaje.toString());
		notaPedido.setDetalles(detalles);
		
		boolean rpta = ServerMail.enviarMailPedido(notaPedido);
		
		String mensajeCorreo;
		
		if(rpta){
			mensajeCorreo = "Su pedido ah sido enviado.";
			productoService.actualizarEstadoSolicitudPedido(strProductos);
		}else{
			mensajeCorreo = "Su pedido no pudo ser enviado. Comuniquese con su administrador.";
		}
		
		ModelAndView mav = irStockCritico(null);
		mav.getModel().put("mensajeCorreo", mensajeCorreo);
		
		return mav;
	}
	
	@RequestMapping("/despachoPedidos.do")
	public ModelAndView iniciarDespachoPedido()
	{
		
		List<PedidoCab> pedidos = pedidoService.obtenerPedidosADespachar();
		ModelMap model = new ModelMap();
		model.addAttribute("pedidos", pedidos);
		
		if(logger.isInfoEnabled()){
			logger.info("iniciarDespachoPedido");
		}
		
		return new ModelAndView("despacharPedido", model);
	}
	
	@SuppressWarnings("unchecked")
	@RequestMapping("/despacharPedido.do")
	public ModelAndView despacharPedido(@RequestParam("idPedido") int idPedido)
	{
		if(logger.isDebugEnabled()){
			logger.debug("despacharPedido(idPedido:'"+idPedido+"')");
		}
		
		boolean rpta = pedidoService.depacharPedido(idPedido);
		String mensaje = "";
		if(rpta)
		{
			mensaje = "El pedido Num. " + idPedido + " ha sido despachado";
		}else
		{
			mensaje = "Error al despachar el pedido Num. " + idPedido;
		}
		
		ModelAndView mav = iniciarDespachoPedido();
		mav.getModel().put("mensaje", mensaje);
		mav.getModel().put("idPedido", "");
		
		return mav;
	}
	
}
